package main

import "fmt"

func main() {
	arr1 := [5]int{1, 2, 3, 4, 5}
	p2 := &arr1

	//p2是数组指针，存的值是arr1数组的地址，本身p2变量又有个地址
	fmt.Println(*p2)          //[1 2 3 4 5]
	fmt.Printf("%p\n", p2)    //0xc00001c0f0
	fmt.Printf("%p\n", &arr1) //0xc00001c0f0
	fmt.Println(&p2)          //0xc00000e028

	arr := [5]int{1, 2, 3, 4, 5}
	//数组的地址和数组第一个元素的地址相同
	fmt.Printf("%p\n", &arr)    //0xc000018120
	fmt.Println(&arr[0])        //0xc000018120
	fmt.Printf("%p\n", &arr[0]) //0xc000018120

	p := &arr             //数组形式的指针
	fmt.Printf("%T\n", p) //*[5]int
	fmt.Println("p=", p)  //p= &[1 2 3 4 5]
	fmt.Println(*p)       //[1 2 3 4 5]

	var p1 *[5]int
	p1 = &arr
	fmt.Println(p1)             //&[1 2 3 4 5]
	fmt.Printf("p1 = %T\n", p1) //*[5]int

	fmt.Println("*p=", *p, "*p1=", *p1) //[1 2 3 4 5] [1 2 3 4 5]
	fmt.Println((*p)[0])
	fmt.Println(p[1]) //直接使用指针/下标 操作数组元素,p的值就是数组第一个元素所在的地址

	//数组的地址和切片的地址相同
	fmt.Printf("%p\n%p\n%p\n", &arr, p, p1)

	fmt.Println("=========")

	for i := 0; i < len(*p); i++ {
		fmt.Println(p[i])
	}

}
